package cn.iocoder.yudao.module.promotion.gift.service.core;

import cn.iocoder.yudao.framework.business.basic.service.PageService;
import cn.iocoder.yudao.module.api.promotion.gift.enums.GiftRecordStatus;
import cn.iocoder.yudao.module.promotion.gift.pojo.dto.AppGiftTakeDTO;
import cn.iocoder.yudao.module.promotion.gift.pojo.dto.AppGiftTransferDTO;
import cn.iocoder.yudao.module.promotion.gift.pojo.dto.GiftRecordQueryDTO;
import cn.iocoder.yudao.module.promotion.gift.pojo.vo.GiftRecordVO;
import jakarta.annotation.Nullable;

import java.util.Collection;
import java.util.Map;

public interface CoreGiftRecordService extends PageService<GiftRecordVO, GiftRecordQueryDTO> {

    /**
     * 获得用户的赠品数量
     *
     * @param userId 用户编号
     * @param status 赠品状态，{@link GiftRecordStatus}
     * @return 赠品数量
     */
    int getCount(Long userId, @Nullable Integer status);

    /**
     * 获得待领取的赠品数量
     *
     * @param userId 用户编号
     * @return 待领取的赠品数量
     */
    default int getPendingCount(Long userId) {
        return getCount(userId, GiftRecordStatus.PENDING.getValue());
    }

    /**
     * 已领数量
     *
     * @param userId 用户编号
     * @param giftActivityIds 赠品编号集合
     * @return 数量：赠品活动编号 -> 数量
     */
    Map<Long, Integer> getTakenCount(Long userId, Collection<Long> giftActivityIds);

    /**
     * 创建赠品记录
     *
     * @param userId 用户编号
     * @param tradeNo 交易单号
     * @param giftActivityIds 赠品活动编号
     * @return 赠品记录编号
     */
    boolean pending(Long userId, String tradeNo, Collection<Long> giftActivityIds);

    /**
     * 领取赠品
     *
     * @param userId 用户编号
     * @param param 请求参数
     */
    boolean take(Long userId, AppGiftTakeDTO param);

    /**
     * 转赠赠品
     *
     * @param userId 用户编号
     * @param param 请求参数
     */
    boolean transfer(Long userId, AppGiftTransferDTO param);

    /**
     * 定时任务，过期的订单进行取消
     */
    int expire();

}